package com.xebest.util;


import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.math.RoundingMode;

/**
 * 数据计算工具类
 *
 * @author 李贝贝
 */
public class BigDecimalUtil {


    /**
     * 两数相加，四舍五入，保留N位数
     *
     * @param addend 加数
     * @param augend 被加数
     * @param scale  精度
     * @return BigDecimal
     * @author 李贝贝
     */
    public static BigDecimal addHalfUp(BigDecimal addend, BigDecimal augend, int scale) {
        MathContext addMc = new MathContext(scale, RoundingMode.HALF_UP); //RoundingMode.HALF_UP 舍入模式，四舍五入 向上
        return addend.add(augend, addMc);
    }

    /**
     * @param minuend    被减数
     * @param subtrahend 减数
     * @param scale      精度
     * @return 差
     * @Description 两数相减，四舍五入，保留N位数
     * @author 李贝贝
     */
    public static BigDecimal subtractHalfUp(BigDecimal minuend, BigDecimal subtrahend, int scale) {
        MathContext subMc = new MathContext(scale, RoundingMode.HALF_UP); //RoundingMode.HALF_UP 舍入模式，四舍五入 向上
        return minuend.subtract(subtrahend, subMc);
    }

    /**
     * 两数相乘，四舍五入，保留N位数
     *
     * @param multiplier   乘数
     * @param multiplicand 被乘数
     * @param scale        精度
     * @return 积
     * @author 李贝贝
     */
    public static BigDecimal multiplyHalfUp(BigDecimal multiplicand, BigDecimal multiplier, int scale) {
        MathContext mulMc = new MathContext(scale, RoundingMode.HALF_UP); //RoundingMode.HALF_UP 舍入模式，四舍五入 向上
        return multiplicand.multiply(multiplier, mulMc);
    }

    /**
     * 两数相除，四舍五入，保留N位数
     *
     * @param dividend 被除数
     * @param divisor  除数
     * @param scale    精度
     * @return 商
     * @author 李贝贝
     */
    public static BigDecimal divideHalfUp(BigDecimal dividend, BigDecimal divisor, int scale) {
        MathContext divMc = new MathContext(scale, RoundingMode.HALF_UP); //RoundingMode.HALF_UP 舍入模式，四舍五入 向上
        return dividend.divide(divisor, divMc);
    }

    /**
     * Object 转bigDecimal
     *
     * @author 杜春静
     */
    public static BigDecimal objectToBigDecimal(Object value) {
        BigDecimal ret = null;
        if (value != null) {
            if (value instanceof BigDecimal) {
                ret = (BigDecimal) value;
            } else if (value instanceof String) {
                ret = new BigDecimal((String) value);
            } else if (value instanceof BigInteger) {
                ret = new BigDecimal((BigInteger) value);
            } else if (value instanceof Number) {
                ret = new BigDecimal(((Number) value).doubleValue());
            } else {
                throw new ClassCastException("Not possible to coerce [" + value + "] from class " + value.getClass() + " into a BigDecimal.");
            }
        }
        return ret;
    }
}
